package com.adingxiong.quickstart.util;


import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName TokenUtils
 * @Description TODO
 * @Author xiongchao
 * @Date 2020/5/21 17:27
 **/
public class TokenUtils {
    //加密的秘钥   相当于服务器的秘钥 一定保管好 不能泄露
    private static  final String secret = "secret";

    //后去token的key  一般token存在请求头和响应头中
    public static final String tokenHeader = "tokenHeader";

    //token失效的时间   这里设置的是 20分钟
    private static final Long expTime =60*2*10000L;


    public static String getToken (String id, String name){
        //这里的参数是自己定义的 可以根据每个人的需求定制不同的生成贵族
        String UUID = "这是额外信息 , UUIDkye";
        Map<String ,Object> map = new HashMap<>();
        map.put("uuidkey" ,UUID);

        JwtBuilder builder = Jwts.builder();
        String token = builder
                .signWith(SignatureAlgorithm.HS256,secret)   //加密方式
                .setId(UUID)   //设置token生成的关键信息
                .setSubject(name)
                .setIssuedAt(new Date())   //设置token生效时间
                .setExpiration(new Date(System.currentTimeMillis() + expTime)) //设置token失效时间
                .addClaims(map)
                .compact();
        System.out.println("生成的Token ： " + token);

        return  token;
    }


    /**
     *  从token中 提取封装的信息
     *    这里token没有进行非空判断   TODO
     * @param token
     * @return
     */
    public static Claims getTokenBody(String token){
        Claims claims = Jwts.parser().setSigningKey(secret)
                .parseClaimsJws(token).getBody();
        return claims;
    }

    public static String getUserName (String token){
        Claims claims = getTokenBody(token);
        String name = claims.getSubject();
        return  name;
    }

    public static String getId (String token){
        Claims claims = getTokenBody(token);
        String id = claims.getId();
        return id ;
    }

    public static String getKey (String token ,String key){
        Claims claims = getTokenBody(token);
        String uuidkey = (String)claims.get(key);
        return uuidkey;
    }


    public static void main (String args []){
        String token = getToken("1" ,"熊超");
        System.out.println("生成的token为：" + token);

        String name = getUserName(token);
        System.out.println("name：" + name);

        String id = getId(token);

        System.out.println("id：" + id);
        String uuidkey = getKey(token ,"uuidkey");
        System.out.println("uuidkey：" + uuidkey);
    }

}

